#include<iostream>
#include<thread>
#include<future>
#include<functional>

//packcage_task的使用
//packcage——task是一个模板类，实例化的对象可以对一个函数进行二次封装
//packcaged_task可以通过get_future获取一个future对象，来获取封装的这个函数的异步执行结果
int Add(int num1,int num2)
 {
    std::this_thread::sleep_for(std::chrono::seconds(3));
     
    return num1+num2;
 }
int main()
{
//std::packaged_task<int(int,int)> task(Add);//task可以当做一个可调用对象执行任务，但是不完全当做一个函数处理
//std::future<int> fu=task.get_future();
//task(11,22);
//std::async(std::launch::async,task,11,22);
//std::thread thr(task,11,12);


//我们可以把task定义指针，传递线程中，然后进行解引用执行
//避免对象生命周期，堆上开辟用智能指针管理

auto ptask=std::make_shared<std::packaged_task<int(int,int)>>(Add);
std::future<int> fu=ptask->get_future();
std::thread thr([ptask]()
{
    (*ptask)(11,22);
});
int sum=fu.get();
std::cout<<sum<<std::endl;
thr.join();
return 0;






}